/**
 * Copyright 2000 self.com.au
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. (http://www.apache.org/licenses/LICENSE-2.0)
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed 
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
 * the specific language governing permissions and limitations under the License.
 *
 * <dhamma-message src="Atisha (11th century Tibetan Buddhist master)">
 * 	The greatest achievement is selflessness. The greatest worth is self-mastery.
 * 	The greatest quality is seeking to serve others. The greatest precept is continual awareness.
 * 	The greatest medicine is the emptiness of everything. The greatest action is not conforming with the worlds ways.
 * 	The greatest magic is transmuting the passions. The greatest generosity is non-attachment.
 * 	The greatest goodness is a peaceful mind. The greatest patience is humility.
 * 	The greatest effort is not concerned with results. The greatest meditation is a mind that lets go.
 * 	The greatest wisdom is seeing through appearances. 
 * </dhamma-message>
 *
 * @author Ashin Wimalajeewa
 */
package self.amigo.tool;

import java.awt.event.ActionEvent;
import java.util.List;

import javax.swing.AbstractAction;
import javax.swing.JMenu;
import javax.swing.JMenuItem;

import self.amigo.editor.cmd.SelectionAlignment;
import self.amigo.editor.cmd.SelectionSameSize;
import self.gee.editor.ICommand;
import self.gee.editor.IDiagramEditor;

public class AlignmentManager {

  private IDiagramEditor          editor;
  
  private JMenuItem               viewAlignTop;
  private JMenuItem               viewAlignBottom;
  private JMenuItem               viewAlignLeft;
  private JMenuItem               viewAlignRight;
  private JMenuItem               viewAlignHorizCentre;
  private JMenuItem               viewAlignVertCentre;

  private JMenuItem               viewSizeAsSmallest;
  private JMenuItem               viewSizeAsBiggest;
  private JMenuItem               viewSizeAsSmallestWidth;
  private JMenuItem               viewSizeAsBiggestWidth;
  private JMenuItem               viewSizeAsSmallestHeight;
  private JMenuItem               viewSizeAsBiggestHeight;
  
  public AlignmentManager( IDiagramEditor ed, List selections ) {
    editor = ed;
  } 
  
  public void resetMenus( int count ) {
    boolean enable = count > 1;
    viewAlignTop.setEnabled( enable );
    viewAlignBottom.setEnabled( enable );
    viewAlignLeft.setEnabled( enable );
    viewAlignRight.setEnabled( enable );
    viewAlignHorizCentre.setEnabled( enable );
    viewAlignVertCentre.setEnabled( enable );
    
    viewSizeAsSmallest.setEnabled( enable );
    viewSizeAsBiggest.setEnabled( enable );
    viewSizeAsSmallestWidth.setEnabled( enable );
    viewSizeAsBiggestWidth.setEnabled( enable );
    viewSizeAsSmallestHeight.setEnabled( enable );
    viewSizeAsBiggestHeight.setEnabled( enable );
  }
  
  public void installMenus( JMenu viewItem ) {
    viewAlignTop = viewItem.add( new AbstractAction( "Align Top" ) {
    	
    	/**
    	 * If the internal state of this class ever changes in such a way that it can't be defaulted,
    	 * then the {@link #serialVersionUID} should be incremented to ensure serialized instances cleanly fail.  
    	 */
    	private static final long serialVersionUID = 1;
    	
          public void actionPerformed( ActionEvent e ) {
//            ICommand cmd =  new SelectionAlignment( editor, 
//                currentSelections, SelectionAlignment.ALIGN_TOPS );
            ICommand cmd =  new SelectionAlignment( editor, 
                SelectionAlignment.ALIGN_TOPS );
            editor.executeCommand( ICommand.ET_EXECUTE, cmd );
          }
        }
      );
      
    viewAlignBottom = viewItem.add( new AbstractAction( "Align Bottom" ) {
    	
    	/**
    	 * If the internal state of this class ever changes in such a way that it can't be defaulted,
    	 * then the {@link #serialVersionUID} should be incremented to ensure serialized instances cleanly fail.  
    	 */
    	private static final long serialVersionUID = 1;
    	
          public void actionPerformed( ActionEvent e ) {
//            ICommand cmd =  new SelectionAlignment( editor, 
//                currentSelections, SelectionAlignment.ALIGN_BOTTOMS );
            ICommand cmd =  new SelectionAlignment( editor, 
                SelectionAlignment.ALIGN_BOTTOMS );
            editor.executeCommand( ICommand.ET_EXECUTE, cmd );
          }
        }
      );
      
    viewAlignLeft = viewItem.add( new AbstractAction( "Align Left" ) {
    	
    	/**
    	 * If the internal state of this class ever changes in such a way that it can't be defaulted,
    	 * then the {@link #serialVersionUID} should be incremented to ensure serialized instances cleanly fail.  
    	 */
    	private static final long serialVersionUID = 1;
    	
          public void actionPerformed( ActionEvent e ) {
//            ICommand cmd =  new SelectionAlignment( editor, 
//                currentSelections, SelectionAlignment.ALIGN_LEFTS );
            ICommand cmd =  new SelectionAlignment( editor, 
                SelectionAlignment.ALIGN_LEFTS );
            editor.executeCommand( ICommand.ET_EXECUTE, cmd );
          }
        }
      );
      
    viewAlignRight = viewItem.add( new AbstractAction( "Align Right" ) {
    	
		/**
		 * If the internal state of this class ever changes in such a way that it can't be defaulted,
		 * then the {@link #serialVersionUID} should be incremented to ensure serialized instances cleanly fail.  
		 */
		private static final long serialVersionUID = 1;
    	
          public void actionPerformed( ActionEvent e ) {
//            ICommand cmd =  new SelectionAlignment( editor, 
//                currentSelections, SelectionAlignment.ALIGN_RIGHTS );
            ICommand cmd =  new SelectionAlignment( editor, 
                SelectionAlignment.ALIGN_RIGHTS );
            editor.executeCommand( ICommand.ET_EXECUTE, cmd );
          }
        }
      );

    viewAlignHorizCentre = viewItem.add( new AbstractAction( "Align Horizontal Center" ) {
    	
    	/**
    	 * If the internal state of this class ever changes in such a way that it can't be defaulted,
    	 * then the {@link #serialVersionUID} should be incremented to ensure serialized instances cleanly fail.  
    	 */
    	private static final long serialVersionUID = 1;
    	
          public void actionPerformed( ActionEvent e ) {
//            ICommand cmd =  new SelectionAlignment( editor, 
//                currentSelections, SelectionAlignment.ALIGN_H_CENTERS );
            ICommand cmd =  new SelectionAlignment( editor, 
                SelectionAlignment.ALIGN_H_CENTERS );
            editor.executeCommand( ICommand.ET_EXECUTE, cmd );
          }
        }
      );
      
    viewAlignVertCentre = viewItem.add( new AbstractAction( "Align Vertical Center" ) {
    	
    	/**
    	 * If the internal state of this class ever changes in such a way that it can't be defaulted,
    	 * then the {@link #serialVersionUID} should be incremented to ensure serialized instances cleanly fail.  
    	 */
    	private static final long serialVersionUID = 1;
    	
          public void actionPerformed( ActionEvent e ) {
//            ICommand cmd =  new SelectionAlignment( editor, 
//                currentSelections, SelectionAlignment.ALIGN_V_CENTERS );
            ICommand cmd =  new SelectionAlignment( editor, 
                SelectionAlignment.ALIGN_V_CENTERS );
            editor.executeCommand( ICommand.ET_EXECUTE, cmd );
          }
        }
      );
      
    viewItem.addSeparator();
    
    viewSizeAsSmallest = viewItem.add( new AbstractAction( "Resize to Smallest Overall" ) {
    	
    	/**
    	 * If the internal state of this class ever changes in such a way that it can't be defaulted,
    	 * then the {@link #serialVersionUID} should be incremented to ensure serialized instances cleanly fail.  
    	 */
    	private static final long serialVersionUID = 1;
    	
          public void actionPerformed( ActionEvent e ) {
//            ICommand cmd =  new SelectionSameSize( editor, 
//                currentSelections, SelectionSameSize.SIZE_AS_SMALLEST, SelectionSameSize.OVERALL );
            ICommand cmd =  new SelectionSameSize( editor, 
                SelectionSameSize.SIZE_AS_SMALLEST, SelectionSameSize.OVERALL );
            editor.executeCommand( ICommand.ET_EXECUTE, cmd );
          }
        }
      );

    viewSizeAsBiggest = viewItem.add( new AbstractAction( "Resize to Biggest Overall" ) {
    	
    	/**
    	 * If the internal state of this class ever changes in such a way that it can't be defaulted,
    	 * then the {@link #serialVersionUID} should be incremented to ensure serialized instances cleanly fail.  
    	 */
    	private static final long serialVersionUID = 1;
    	
          public void actionPerformed( ActionEvent e ) {
//            ICommand cmd =  new SelectionSameSize( editor, 
//                currentSelections, SelectionSameSize.SIZE_AS_BIGGEST, SelectionSameSize.OVERALL );
            ICommand cmd =  new SelectionSameSize( editor, 
                SelectionSameSize.SIZE_AS_BIGGEST, SelectionSameSize.OVERALL );
            editor.executeCommand( ICommand.ET_EXECUTE, cmd );
          }
        }
      );

    viewSizeAsSmallestWidth = viewItem.add( new AbstractAction( "Resize to Smallest Width" ) {
    	
    	/**
    	 * If the internal state of this class ever changes in such a way that it can't be defaulted,
    	 * then the {@link #serialVersionUID} should be incremented to ensure serialized instances cleanly fail.  
    	 */
    	private static final long serialVersionUID = 1;
    	
          public void actionPerformed( ActionEvent e ) {
//            ICommand cmd =  new SelectionSameSize( editor, 
//                currentSelections, SelectionSameSize.SIZE_AS_SMALLEST, SelectionSameSize.WIDTH );
            ICommand cmd =  new SelectionSameSize( editor, 
                SelectionSameSize.SIZE_AS_SMALLEST, SelectionSameSize.WIDTH );
            editor.executeCommand( ICommand.ET_EXECUTE, cmd );
          }
        }
      );

    viewSizeAsBiggestWidth = viewItem.add( new AbstractAction( "Resize to Biggest Width" ) {
    	
    	/**
    	 * If the internal state of this class ever changes in such a way that it can't be defaulted,
    	 * then the {@link #serialVersionUID} should be incremented to ensure serialized instances cleanly fail.  
    	 */
    	private static final long serialVersionUID = 1;
    	
          public void actionPerformed( ActionEvent e ) {
//            ICommand cmd =  new SelectionSameSize( editor, 
//                currentSelections, SelectionSameSize.SIZE_AS_BIGGEST, SelectionSameSize.WIDTH );
            ICommand cmd =  new SelectionSameSize( editor, 
                SelectionSameSize.SIZE_AS_BIGGEST, SelectionSameSize.WIDTH );
            editor.executeCommand( ICommand.ET_EXECUTE, cmd );
          }
        }
      );
      
    viewSizeAsSmallestHeight = viewItem.add( new AbstractAction( "Resize to Smallest Height" ) {
    	
    	/**
    	 * If the internal state of this class ever changes in such a way that it can't be defaulted,
    	 * then the {@link #serialVersionUID} should be incremented to ensure serialized instances cleanly fail.  
    	 */
    	private static final long serialVersionUID = 1;
    	
          public void actionPerformed( ActionEvent e ) {
//            ICommand cmd =  new SelectionSameSize( editor, 
//                currentSelections, SelectionSameSize.SIZE_AS_SMALLEST, SelectionSameSize.HEIGHT );
            ICommand cmd =  new SelectionSameSize( editor, 
                SelectionSameSize.SIZE_AS_SMALLEST, SelectionSameSize.HEIGHT );
            editor.executeCommand( ICommand.ET_EXECUTE, cmd );
          }
        }
      );

    viewSizeAsBiggestHeight = viewItem.add( new AbstractAction( "Resize to Biggest Height" ) {
    	
    	/**
    	 * If the internal state of this class ever changes in such a way that it can't be defaulted,
    	 * then the {@link #serialVersionUID} should be incremented to ensure serialized instances cleanly fail.  
    	 */
    	private static final long serialVersionUID = 1;
    	
          public void actionPerformed( ActionEvent e ) {
//            ICommand cmd =  new SelectionSameSize( editor, 
//                currentSelections, SelectionSameSize.SIZE_AS_BIGGEST, SelectionSameSize.HEIGHT );
            ICommand cmd =  new SelectionSameSize( editor, 
                SelectionSameSize.SIZE_AS_BIGGEST, SelectionSameSize.HEIGHT );
            editor.executeCommand( ICommand.ET_EXECUTE, cmd );
          }
        }
      );
      
//    viewToFrontItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(107, java.awt.event.KeyEvent.ALT_MASK, false)); // alt num +
//    viewToBackItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(109, java.awt.event.KeyEvent.ALT_MASK, false)); // alt num +
//    viewToMoveForwardItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(107, 0, false)); // num +
//    viewToMoveBackwardItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(109, 0, false)); // num -
    
    viewAlignTop.setEnabled( false );
    viewAlignBottom.setEnabled( false );
    viewAlignLeft.setEnabled( false );
    viewAlignRight.setEnabled( false );
    viewAlignHorizCentre.setEnabled( false );
    viewAlignVertCentre.setEnabled( false );

    viewSizeAsSmallest.setEnabled( false );
    viewSizeAsBiggest.setEnabled( false );
    viewSizeAsSmallestWidth.setEnabled( false );
    viewSizeAsBiggestWidth.setEnabled( false );
    viewSizeAsSmallestHeight.setEnabled( false );
    viewSizeAsBiggestHeight.setEnabled( false );
  }
}